// 表字段信息定义
export interface TabFieldType {
	PageID: number; // PageID；
	FieldID: string; // 字段ID
	FieldName: string; // 字段名
	Label: string; // 显示的标签名
	InputType: string; // 输入组件类型,对应基础组件名
	Type?: string; // 输入组件类型
	IsViewInTab?: boolean; // 是否在表格中显示
	ColWidth?: number; // 表格中显示宽度，0不限宽
	InputDataType?: EInputDataType; // 是否上级传入：0:前端输入，1:参数传入 2:使用固定值 3:本地存储 4：表达式 对应表：isParentInData
	InputDataCfg?: string; // 当InputDataType为1是：为传入参㶼名或Vuex里取值方法  对表inputFieldName
	IsFilter?: boolean; // 是否在过滤选项中显示
	FilterWidth?: number; // 过滤选项中显示宽度，0不限宽
	TipsText?: string; // 输入时提示的文本内容
	IsAddNeed?: boolean; // 添加是否需要
	AddColWidth?: number; // 添加的时候显示的宽度，0不限宽
	AddSeqID?: number; // 添加的时候显示的顺序
	AddProcessType?: ProcessType; // 添加表单处理类型：0:处理 1:不处理 2:隐藏 3:只读 4:必填
	EditColWidth?: number; // 修改的时候显示的宽度，0不限宽
	EditSeqID?: number; // 修改的时候显示的顺序
	EditProcessType?: ProcessType; // 修改表单处理类型：0:处理 1:不处理 2:隐藏 3:只读 4:必填
	IsEditNeed?: boolean; // 修改是否需要处理
	Accuracy?: any; // 数据精度，显示小数据点位数
	IfCascadeShow?: boolean; // 是否开否级联
	CascadeCfg?: CascadeCfgType | null; // 级联配置
	NeedVerify?: boolean; // 是否需要数据验证
	VerifyFunc?: string; // 数据验证函数
	Extend: Record<string, any>; // 扩展配置：如
	DataStorageMode?: string;
	InputDefine?: any;
	Doptions?: any;
	// Depend: any;
	InputCheck?: IInputCheck;
	Language?: languageType; // 代码编辑器的语言
	SequenceConfig?: { time: timestampType; prefix: string; sequenceName: string };
	[x: string]: any;
}

export enum timestampType {
	'second' = '0',
	'msec' = '1',
}
export type languageType = 'css' | 'html' | 'json' | 'typescript' | 'javascript';
export interface CascadeCfgType {
	type: string; // "value"/"change"
	label: string; // "级联父级字段名"
	value: string; // "触发事件的目标值" 当type为value时该字段有效
}

export interface CascadeRelationType {
	fieldName: string;
	childs: CascadeRelationType[];
	componentKey: string;
	type: string;
	value: string;
	locatedIdx: number;
}

export enum ProcessType {
	Process = 0,
	NotNeed,
	Hidden,
	Readonly,
	Must,
}

/**
 * 数据传入类型
 *
 */
export enum EInputDataType {
	FrontType = 0, // 前端输入
	PassFromUp, //Vuex和父级传入
	StaticVal, //固定值
	CacheSotre, //本地缓存localstorage
	Exp, // 表达式
}

export enum DialogType {
	confirm = 0,
	query,
	add,
	edit,
	delete,
	customize,
	detail,
	export,
	import,
	print,
	tplprint,
	down,
}

export interface DialogDefineType {
	OpType: DialogType; // 对话框类型 confirm, add, edit, delete, customize, detail, print, tplprint(模版打印),import, export, down
	Width: number; // 对话框宽度0为不限
	Height: number; // 对话框高度0为不限
	SubmitUrl: string; // 提交地址
	Title: string; // 显示标题
	Content: string; // 显示内容
	InPutData: any; // 输入参数
	ExcuteData: any; // 执行过程生成的参数
	IsBatch?: boolean; // 是否批量，添加按钮才有这个配置
	QueryRequiresBatchDataUrl?: string; // 查询需要批量插入到主表的数据，添加按钮才有这个配置
	Params?: Array<Record<string, any>>; // 携带参数
	UpdateUrl: string; // 修改接口 批量按钮才会有
}

export interface ButtonDefineType {
	ButtonKey: string; // Key;
	ShowLocal: string; // 'query'|'optcol'
	Title: string; // 按钮显示名称
	SubmitUrl: string; // 点击提交的URL
	ShowCtrl: string; // 控制是否显示字段,可以是字段，可以是表达式
	NeedComfirm: boolean; //  是否需要弹出确认框
	// 确认事件处理,
	ConfirmEventDefine: ButtonEventType | null;
	// 弹出框时，弹出框前执行的操作：
	BeforeEventDefine: ButtonEventType | null;
	EventDefine: ButtonEventType | null;
	// 执行成功后的操作   // 跳转 弹出框  执行回调
	AfterEvnetDefine: ButtonEventType | null;
	// 按钮颜色： Primary、Success、Info、Warning、Danger
	// 按钮风格： default、plain、round、circle
	BtnStyleColor: ButtonStyleColor;
	BtnStyleType: ButtonStyleType;
}

export interface ButtonEventType {
	// 操作类型：function, jump, (tabpage, customizepage, inner(内容：增，改，详情))弹窗，
	OpType: EventExcuteType;
	// 要处理的目标：执行函数时为函数名，跳转时为跳转URL, 查询时为URL, 自定义表单或自定义页面PAGEID
	TargetVal: string;
	// 弹窗类型索引
	DialogDefine: DialogDefineType;
	// 参数
	Params: ParameterType[] | null | string;
}

export interface ParameterType {
	Type: number;
	ParamKey: string;
	ParamVal: any;
	InputDataType: number;
}

export interface OperateColumnType {
	ColWidth: string;
	ColumnName: string;
	ViewSeqID: string;
	Index: number;
	FixedCol: {
		fixedType: 'left' | 'right';
		isFixed: boolean;
	};
}
export interface OperateColumnDefType extends OperateColumnType {
	FieldIndex?: number;
	FieldName?: string;
}

export interface ColButtonDefineType extends OperateColumnType {
	btns: ButtonDefineType[];
}
export interface TablePageType {
	PageId: number;
	PageName: string;
	TableName: string;
	FieldDefines: TabFieldType[] | null;
	TableShowDefines: ShowDefineType[] | (ShowDefineType | OperateColumnDefType)[];
	AddShowDefines: ShowDefineType[] | null;
	EditShowDefines: ShowDefineType[] | null;
	FilterDefines: ShowDefineType[] | null;
	// 开启统计字段时的字段列表
	StatisticsDefines: ShowDefineType[] | null;
	DialogDefines: DialogDefineType[] | null;
	ButtonDefines: ButtonDefineType[] | null;
	ColButtonDefines: Array<ColButtonDefineType> | null;
	// NeedConfirm: boolean; // 是否需要弹出确认框
	// ConfirmCfg: DialogDefineType | null;
	NeedPagination: boolean; // 是否需要分页
	InputData: Map<string, string> | null; // 传入参数
	// 是否开启统计功能
	NeedStatistics: boolean;
	BusinessID: string;
	EntCode: string;
	SubSysID: string;
	CheckBox: boolean;
	DataSourceOptID: string;
	Extend: string;
	MainParams: any;
	// 新增、修改弹窗宽度
	PopupSize: number;
	// 导入模版下载地址
	ImportTemp: string;
	SearchEvent: Record<string, any>; // 查询
	OperateColumnDef: OperateColumnDefType[]; // 操作列配置
}
export interface IInputCheck {
	isCheck: 0 | 1; // 是否开启
	type: EInputCheckType;
	value: string;
	tips: string;
}

export enum EInputCheckType {
	RegEx,
	SelectFn,
	CustomFn,
}
export interface ShowDefineType {
	FieldName: string;
	FieldIndex: number; // 表字段数据的索引
	ViewSeqID?: number; // 排序字段
	ColumnName?: string;
	ColWidth?: string;
	Index?: number;
	FixedCol?: {
		fixedType: 'left' | 'right';
		isFixed: boolean;
	};
}

export interface FuncDefineType {
	FuncType: string; // 函数类型 Hooks,Globle,
	FuncName: string; // 函数名称
	FuncCode: string; // 函数代码
	FuncParams: FuncParamsType[] | null; // 函数参数
}

export interface FuncParamsType {
	ParamsKey: string;
	ParamsVal: string;
}

// 对应Element的按钮样式
export enum ButtonStyleColor {
	Primary,
	Success,
	Info,
	Warning,
	Danger,
}

export enum ButtonStyleType {
	default,
	plain,
	round,
	circle,
}

export enum EventExcuteType {
	Function = 0,
	Jump,
	Customizepage,
	TablePage,
	Interface,
	Inner = 20,
}
export enum EInputType {
	'el-input',
	'el-select',
	'el-date',
	'el-time',
	'select_d',
	'el-textarea',
	'systime',
	'el-img',
	'rich',
	'video',
	'el-cascader',
	'exp',
	'code-editor',
	'sequence',
	'dialog-select',
}
export const InputTypeArray: string[] = [
	'el-input',
	'el-select',
	'el-date',
	'el-time',
	'select_d',
	'el-textarea',
	'systime',
	'el-img',
	'rich',
	'video',
	'el-cascader',
	'exp',
	'code-editor',
	'sequence',
];

/*
 **********分页面配置***********
 * sizes：每页行数数组
 * layout：显示布局
 * total： 总页数
 * pagesize：当前每页显示行数
 * pageShow： 是否显示分页组件
 */
export interface PageInfoType {
	sizes: number[];
	layout: string;
	total: number;
	pagesize: number;
	pageShow: boolean;
	currentPage: number;
}

export interface DialogConfigType {
	title: string; // 标题
	fieldDefines: TabFieldType[]; // 字段定义
	submitUrl: string;
	opType: DialogType | null;
	width: number | 'auto';
	formParmas?: Record<string, any>; // 当前行的参数
	ot?: EventExcuteType;
	superiorParams?: Record<string, any>; // 上级传参
	formData?: Record<string, any>;
	ExcuteData?: Record<string, any>;
	params?: Record<string, unknown>;
	isDisabledHanlde?: boolean; // 操作表单的控件，
	paramsMap?: Array<Record<string, any>>; // 参数映射
	batchAddUrl?: string; // 批量添加提交地址
	isTabRadio?: boolean; // 表格多选
	fromPageID?: number;
}
